package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {

	@Autowired
	private RoleService roleService;

	@Autowired
	private ModuleService moduleService;

	/**
	 * 分页查询
	 *  参数：
	 *      page：当前页
	 *      size：每页查询条数
	 *  业务：调用service查询返回值PageInfo
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) {
		/*
		  调用service分页查询
				返回值：PageInfo
				参数：
					page，size，所属企业id
		 */
		PageInfo info = roleService.findAll(page,size,getLoginCompanyId());
		request.setAttribute("page",info);



		return "system/role/role-list";
	}

	/**
	 * 进入添加页面
	 */
	@RequestMapping("/toAdd")
	public String toAdd() {
		return "system/role/role-add";
	}

	/**
	 * 进入修改页面
	 *      参数：角色id
	 *      业务：根据id查询角色
	 */
	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		//根据id查询角色
		Role role = roleService.findById(id);
		request.setAttribute("role",role);
		return "system/role/role-update";
	}


	/**
	 * 保存或者更新
	 *     1.设置企业属性
	 *     2.判断逻辑
	 *       2.1 没id，保存
	 *       2.2 有id，更新
	 *     3.重定向到列表list
	 */
	@RequestMapping("/edit")
	public String edit(Role role) {
		//1.设置企业属性
		role.setCompanyId(getLoginCompanyId());
		role.setCompanyName(getLoginCompanyName());
		//2.判断逻辑
		if(StringUtils.isEmpty(role.getId())) {
			//保存
			roleService.save(role);
		}else{
			//更新
			roleService.update(role);
		}
		return "redirect:/system/role/list.do";
	}



	/**
	 * 根据id删除
	 *  参数：角色id
	 */
	@RequestMapping("/delete")
	public String delete(String id) {
		//调用service删除
		roleService.delete(id);
		return "redirect:/system/role/list.do";
	}


	/**
	 * 进入分配权限页面
	 */
	@RequestMapping("/roleModule")
	public String roleModule(String roleid) {
		//根据角色id查询角色
		Role role = roleService.findById(roleid);
		request.setAttribute("role",role);
		return "system/role/role-module";
	}

	/**
	 * 作用：接收ajax请求，返回json数据
	 *     * 前端构造所有的菜单（模块）树
	 * 返回json数据格式：
	 *  [
	 *       { id:11, pId:1, name:"随意勾选 1-1"},
	 *       { id:111, pId:11, name:"随意勾选 1-1-1",checked:true}
	 *  ]
	 *
	 *  List<Map>
	 *
	 *  map : 通过模块对象转化而来的
	 *
	 * 从数据库中查询所有的模块（菜单）
	 *
	 *
	 *
	 * 业务：
	 *      1.查询所有的模块
	 *      2.根据角色id，查询次角色所有的模块
	 *
	 */
	@RequestMapping("/getZtreeNodes")
	public @ResponseBody List<Map> getZtreeNodes(String roleId) {
		List<Map> list = new ArrayList();
		//1.查询所有的模块
		List<Module> modules = moduleService.findAll();                     //用户管理，角色管理，合同管理，日志管理
		//2.根据角色id，查询次角色所有的模块
		List<Module> roleModules = moduleService.findByRoleId(roleId);      //用户管理，合同管理
		//3.循环所有模块，每个模块对象构造一个MAP集合
		for (Module module : modules) {     //   用户管理，  角色管理，  合同管理， 日志管理
			Map map = new HashMap();
			map.put("id",module.getId());
			map.put("pId",module.getParentId());
			map.put("name",module.getName());
			if(roleModules.contains(module)) {          //根据数组中每个对象和目标对象，进行equals比较
				map.put("checked", true); //默认勾选
			}
			//4.map集合存入到list中
			list.add(map);
		}
		//5.返回数据list
		return list;
	}


	/**
	 * 分配模块
	 *     参数：
	 *      1.角色id  ： roleid
	 *      2.所有勾选的模块id字符串（已“，”隔开） ：moduleIds
	 *     业务：
	 *      调用service分配
	 */
	@RequestMapping("/updateRoleModule")
	public String updateRoleModule(String roleid,String moduleIds) {
		moduleService.updateRoleModule(roleid,moduleIds);
		return "redirect:/system/role/roleModule.do?roleid="+roleid;
	}
}
